package com.fh;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author 方小勤
 * @version 1.0~
 */
public class Cat {
    private String name = "招财";
    public int age = 10;
    public Cat() {
    }
    public Cat(String name) {
        this.name = name;
    }
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        //根据配置文件 re.properties 指定信息，创建 Cat 对象并调用方法hi

        //我们传统的方式就是new一个对象，这个是硬编码，只能通过修改源码
//        Cat cat = new Cat();
//        cat.hi();

        //这里我们通过反射
        //1. 使用 properties 类，读写配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src/re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
        System.out.println("classfullpath:" + classfullpath);
        System.out.println("methodName:" + methodName);

        //3. 使用反射机制解决
        //1） 加载类，返回Class类型的对象cls
        Class cls = Class.forName(classfullpath);
        //2) 通过cls得到你的加载的类 com.fh.Cat 的对象实例
        Object o = cls.getDeclaredConstructor().newInstance();
        System.out.println("o的运行类型 "+ o.getClass());//运行类型
        //3) 通过 cls 得到你加载的类 com.fh.Cat 的 methodName"hi"的方法对象
        //反射中方法视为对象
        Method method = cls.getMethod(methodName);
        //4) 通过method调用方法：即通过方法对象来实现调用方法
        method.invoke(o);
    }
    public void hi(){
//        System.out.println("动态反射成功调用，正在执行hi方法");
    }
}
